package co.edu.udea.xyz.dao.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.xyz.dao.PersonaDAO;
import co.edu.udea.xyz.dto.Persona;
import co.edu.udea.xyz.util.exception.XYZException;

/**
 * Clase PersonaDAOHibernate 
 * Hereda HibernateDaoSupport
 * Implementa PersonaDAO
 * 
 * Contiene los metodos para el manejo de las Personas.
 * @author JuanVargas
 *
 */
public class PersonaDAOHibernate extends HibernateDaoSupport implements
		PersonaDAO {

	public PersonaDAOHibernate() {
		
	}
	
	/**
	 * Metodo para obtener una lista de Personas
	 * que contiene la tabla PERSONAS de la Base de Datos.
	 */
	@Override
	public List<Persona> obtener() throws XYZException {
		Session session = null;
		List<Persona> personas = new ArrayList<Persona>();
		
		try{
			session = getSession();
			Criteria criteria = session.createCriteria(Persona.class);
			personas = criteria.list();
		}catch(HibernateException e){
			throw new 	XYZException(e);
		}
		return personas;
	}

	/**
	 * Metodo Obtener persona segun su cedula.
	 * @param cedula de la persona
	 * @return persona
	 */
	@Override
	public Persona obtener(int cedula) throws XYZException {
		Session session = null;
		Persona persona = null;
		
		try{
			session = getSession();
			persona = (Persona)session.get(Persona.class, cedula);
		
		}catch(HibernateException e){
			throw new XYZException(e);
		}
		return persona;
	}

	/**
	 * Metodo que guarda una persona en la base de datos
	 * @param Persona
	 */
	@Override
	public void guardar(Persona persona) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.save(persona);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}
	}
	

	/**
	 * Metodo que actualiza una persona en la base de datos
	 * @param Persona
	 */
	@Override
	public void actualizar(Persona persona) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.update(persona);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}
	}

	/**
	 * Elimina una persona de la base de datos
	 */
	@Override
	public void eliminar(Persona persona) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.delete(persona);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}
		
	}

	
	


}
